#include <iostream>
#include <string>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

using namespace std;

void PrintPending()
{
  sigset_t pending;
  sigpending(&pending); // 获取pending表
  for (int i = 31; i > 0; i--)
  {
    if (sigismember(&pending, i)) // 利用该函数判断特定信号是否存在于pending表中，存在则打印1，不存在打印0
    {
      cout << 1;
    }
    else
      cout << 0;
  }
  cout << endl;
}

int main()
{
    cout << "running... : " << getpid() << endl;
    sigset_t mask, omask;
    sigemptyset(&mask);
    sigemptyset(&omask);

    sigaddset(&mask, 2);
    sigaddset(&mask, 40);

    sigprocmask(SIG_SETMASK, &mask, &omask);

    while(true)
    {
        PrintPending();
        sleep(1);
    }

    return 0;
}

// void sigcb(int signo)
// {
//     cout << "获得了 : " << signo << "号信号" << endl;
// }

// int main()
// {
//     struct sigaction act;
//     act.sa_handler = sigcb;
//     sigaction(2, &act, nullptr);
//     // signal(2, sigcb);

//     while(true)
//     {
//         cout << "running... " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }

// void sighander(int signo)
// {
//   cout << "获得了" << signo << "信号" << endl;
//   pid_t id = 0;
//   while ( (id = waitpid(-1, nullptr, 0)) > 0)
//   {
//     cout << "回收子进程 : " << id << endl;
//   }
// }

// int main()
// {
//   signal(17, SIG_IGN);
//   for(int i = 0; i < 10; i++)
//   {
//     pid_t id = fork();
//     if (id == 0)
//     {
//       sleep(5);
//       cout << "子进程退出" << endl;
//       exit(10);
//     }
//   }

//   int cnt = 10;
//   while (true)
//   {
//     sleep(1);
//     cnt--;
//     if (cnt == 0)
//       break;
//   }

//   return 0;
// }

// volatile int flag = 0;

// void sighander(int signo)
// {
//   cout << "获得了" << signo << "信号" << endl;
//   flag = 1;
//   cout << "flag已修改为" << flag << endl;
// }

// int main()
// {
//   signal(2, sighander);

//   while(!flag);

//   return 0;
// }

// void PrintPending()
// {
//   sigset_t pending;
//   sigpending(&pending); // 获取pending表
//   for (int i = 31; i > 0; i--)
//   {
//     if (sigismember(&pending, i)) // 利用该函数判断特定信号是否存在于pending表中，存在则打印1，不存在打印0
//     {
//       cout << 1;
//     }
//     else
//       cout << 0;
//   }
//   cout << endl;
// }

// void sighander(int signo)
// {
//   cout << "获得了" << signo << "信号" << endl;
// }

// int main()
// {
//   cout << "running... : " << getpid() << endl;
//   signal(2, sighander);
//   signal(3, sighander);
//   signal(4, sighander);
//   signal(5, sighander);

//   sigset_t mask, omask;
//   sigemptyset(&mask);
//   sigaddset(&mask, 3);
//   sigaddset(&mask, 4);
//   sigaddset(&mask, 5);
//   sigprocmask(SIG_SETMASK, &mask, &omask);

//   int cnt = 20;
//   while(true)
//   {
//     PrintPending();
//     sleep(1);
//     cnt--;
//     if(cnt == 0)
//     {
//       sigprocmask(SIG_SETMASK, &omask, nullptr);
//     }
//   }

//   return 0;
// }

// int main()
// {
//   struct sigaction act, oact;
//   sigemptyset(&act.sa_mask);
//   sigaddset(&act.sa_mask, 2);
//   sigaddset(&act.sa_mask, 3);

//   act.sa_handler = sighander;
//   sigaction(2, &act, nullptr);

//   while (true)
//   {
//     cout << "running... : " << getpid() << endl;
//     sleep(1);
//   }

//   return 0;
// }

// void PrintPending()
// {
//   sigset_t pending;
//   sigpending(&pending); // 获取pending表
//   for(int i = 31; i > 0; i--)
//   {
//     if(sigismember(&pending, i)) // 利用该函数判断特定信号是否存在于pending表中，存在则打印1，不存在打印0
//     {
//       cout << 1;
//     }
//     else cout << 0;
//   }
//   cout << endl;
// }

// void sighander(int signo)
// {
//   cout << "获得了" << signo << "号信号" << endl;
//   int cnt = 5;
//   while(true)
//   {
//     PrintPending();
//     cnt--;
//     if(cnt == 0)
//       break;

//     sleep(1);
//   }
// }

// int main()
// {
//   signal(2, sighander);

//   while(true)
//   {
//     cout << "running...  : " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   sigset_t set, oset;

//   // 将要使用的set表初始化
//   sigemptyset(&set);
//   sigemptyset(&oset);
//   signal(2, sighander); // 对2好信号自定义捕捉

//   int cnt = 5;
//   while(true)
//   {
//     PrintPending(); // 打印pending表
//     sleep(1);
//     cnt--;

//     if(cnt == 0)
//     {
//       sigaddset(&set, 2);
//       sigprocmask(SIG_BLOCK, &set, &oset); // 对2号信号进行阻塞
//       cout << "屏蔽了二号信号" << endl;
//     }

//     if(cnt == -5)
//     {
//       sigprocmask(SIG_SETMASK, &oset, &oset); // 取消对2号信号的阻塞
//       cout << "取消屏蔽二号信号" << endl;
//     }
//   }
//   return 0;
// }

// void sighander(int signo)
// {
//   cout << "获得了" << signo << "号信号" << endl;
// }

// int main()
// {
//   int a = 10 / 0;
//   return 0;
// }

// int main()
// {
//   sigset_t
//   signal(2, SIG_IGN);

//   while(true)
//   {
//     cout << "running..." << endl;
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   signal(2, sighander);

//   int cnt = 5;
//   while(true)
//   {
//     cout << "running... : " << cnt << endl;
//     sleep(1);

//     cnt--;
//     if(cnt < 0)
//     {
//       signal(2, SIG_DFL);
//     }
//   }
//   return 0;
// }

// int cnt = 0;

// void sighandler(int signo)
// {
//   cout << "cnt加了 " << cnt << "次" << endl;
//   exit(0);
// }

// int main()
// {
//   signal(14, sighandler);
//   alarm(1);
//   while(true)
//   {
//     cnt++;
//     //cout << cnt << "次" << endl;
//   }
//   return 0;
// }

// void sighandler(int signo)
// {
//   cout << "接收到了" << signo << "信号" << endl;
//   sleep(1);
// }

// int main()
// {
//   signal(8, sighandler);
//   int a = 10 / 0;
//   return 0;
// }

// int main()
// {
//   int* ptr = nullptr;
//   *ptr = 100;
//   return 0;
// }

// int main()
// {
//   int a = 10;
//   a /= 0;
//   return 0;
// }

// void sighandler(int signo)
// {
//   cout << "接收到了" << signo << "信号" << endl;
// }

// int main()
// {
//   raise(9);
//   // abort();

//   while(true)
//   {
//     cout << "running..." << getpid() <<  endl;
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   signal(6, sighandler);

//   abort();

//   while(true)
//   {
//     cout << "running..." << getpid() <<  endl;
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   while(true)
//   {
//     cout << "running..." << getpid() <<  endl;
//     sleep(1);
//   }
//   return 0;
// }

// void mykill(int pid, string signumber)
// {
//   int signum = stoi(signumber);
//   kill(pid, signum);
// }

// int main(int argc, char* argv[])
// {
//   if(argc != 3)
//   {
//     cout << "operation error" << endl;
//     return 1;
//   }

//   mykill(stoi(string(argv[2])), argv[1] + 1);

//   return 0;
// }

// void sighandler(int signo)
// {
//   cout << "接收到了" << signo << "信号" << endl;
//   exit(0);
// }

// int main()
// {
//   signal(2, sighandler);
//   signal(3, sighandler);
//   signal(19, sighandler);

//   while(true)
//   {
//     cout << "running... " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   while(true)
//   {
//     cout << "running... " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }
